/*
 * @Author: aggfb 714740235@qq.com
 * @Date: 2024-05-02 17:30:33
 * @LastEditors: aggfb 714740235@qq.com
 * @LastEditTime: 2024-12-29 22:46:56
 * @FilePath: \label_rack_control\firmware\model\crc\crc16.h
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%A
 */
#ifndef _ULOG_H
#define _ULOG_H

#include <stdint.h>

#define ULOG_ENABLED  (1) /* 是否开放log打印 */

typedef enum{
    ULOG_TRACE_LEVEL = 100,
    ULOG_DEBUG_LEVEL,
    ULOG_INFO_LEVEL,
    ULOG_WARNING_LEVEL,
    ULOG_ERROR_LEVEL,
    ULOG_CRITICAL_LEVEL,
    ULOG_ALWAYS_LEVEL,
}ulog_level_t;

#ifdef ULOG_ENABLED 
    #define ULOG_INITO ulog_init()
    #define ULOG_SUBSCRIBE(a, b) ulog_subscribe(a, b) 
    #define ULOG_UNSUBSCRIBE(a) ulog_unsubscribe(a) 
    #define ULOG_LEVEL_NAME (a) ulog_level_name(a) 
    #define ULOG(...) ulog_message(__VA_ARGS__) 
    #define ULOG_TRACE(...) ulog_message(ULOG_TRACE_LEVEL,__VA_ARGS__)
    #define ULOG_DEBUG(...) ulog_message(ULOG_DEBUG_LEVEL,__VA_ARGS__)
    #define ULOG_INFO(...) ulog_message(ULOG_INFO_LEVEL,__VA_ARGS__)
    #define ULOG_WARNING(...) ulog_message (ULOG_WARNING_LEVEL,__VA_ARGS__)
    #define ULOG_ERROR(...) ulog_message(ULOG_ERROR_LEVEL,__VA_ARGS__)
    #define ULOG_CRITICAL(...) ulog_message(ULOG_CRITICAL_LEVEL,__VA_ARGS__)
    #define ULOG_ALWAYS(...) ulog_message(ULOG_ALWAYS_LEVEL,VA __VA_ARGS__) 
#else 
    #define ULOG INITO do{}while(0) 
    #define ULOG_SUBSCRIBE(a, b) do while()
#endif

typedef enum{
    ULOG_ERR_NONE=0,
    ULOG_ERR_SUBSCRIBERS_EXCEEDED,
    ULOG_ERR_NOT_SUBSCRIBED,
}ulog_err_t;

#ifndef ULOG_MAX_SUBSCRIBERS
#define ULOG_MAX_SUBSCRIBERS 2
#endif

#ifndef ULOG_MAX_MESSAGE_LENGTH 
#define ULOG_MAX_MESSAGE_LENGTH 0xff
#endif 

typedef void (*ulog_function_t)(ulog_level_t severity, char time, char *msg);
void ulog_init(void); 
ulog_err_t ulog_subscribe(ulog_function_t fn, ulog_level_t threshold);
ulog_err_t ulog_unsubscribe(ulog_function_t fn);

const char *ulog_level_name(ulog_level_t level);

void ulog_message(ulog_level_t severity, const char fmt, ...);

#endif
